/**
 * ReportGear(2011)
 */
package com.reportgear.report.model.cell;

import com.reportgear.core.api.Valueable;
import com.reportgear.core.api.XmlSerializer;
import com.reportgear.report.model.cell.style.Style;

/**
 * 报表单元格接口，报表采用类Excel设计报表,真个页面由单元格组成
 * 
 * @version 1.0 2011-3-9
 * @author <a herf="lexloo@gmail.com">lexloo</a>
 * @since Report 1.0
 */
public interface Cell extends Valueable<Object>, XmlSerializer {
	/**
	 * 行列对象
	 */
	public class CR {
		private int column;
		private int row;

		/**
		 * 构造函数
		 * 
		 * @param column
		 *            所在行
		 * @param row
		 *            所在列
		 */
		public CR(int column, int row) {
			this.column = column;
			this.row = row;
		}

		/**
		 * 设置所在列
		 * 
		 * @param column
		 *            列
		 */
		public void setColumn(int column) {
			this.column = column;
		}

		public int getColumn() {
			return column;
		}

		/**
		 * 设置所在行
		 * 
		 * @param row
		 *            行
		 */
		public void setRow(int row) {
			this.row = row;
		}

		public int getRow() {
			return row;
		}
	}

	/**
	 * 获取单元格所在列(0为第一列)
	 * 
	 * @return 单元格所在列
	 */
	public int getColumn();

	/**
	 * 设置单元格所在列(0为第一列)
	 * 
	 * @param column
	 *            列
	 */
	public void setColumn(int column);

	/**
	 * 获取单元格所在行(0为第一行)
	 * 
	 * @return 单元格所在行
	 */
	public int getRow();

	/**
	 * 设置单元格所在列(0为第一行)
	 * 
	 * @param column
	 *            行
	 */
	public void setRow(int row);

	/**
	 * 获取单元格列跨度
	 * 
	 * @return 单元列跨度
	 */
	public int getColumnSpan();

	/**
	 * 设置单元格列跨度
	 * 
	 * @param columnSpan
	 *            列跨度
	 */
	public void setColumnSpan(int columnSpan);

	/**
	 * 获取单元格行跨度
	 * 
	 * @return 单元格行跨度
	 */
	public int getRowSpan();

	/**
	 * 设置单元格行跨度
	 * 
	 * @param column
	 *            单元格行跨度
	 */
	public void setRowSpan(int rowSpan);

	/**
	 * 设置单元格样式
	 * 
	 * @param style
	 *            单元格样式
	 */
	public void setStyle(Style style);

	/**
	 * 获取单元格样式
	 * 
	 * @return 单元格样式
	 */
	public Style getStyle();

	/**
	 * 是否被合并
	 * 
	 * @return 是否被合并
	 */
	public boolean isMerged();

	/**
	 * 设置合并状态
	 * 
	 * @param merged
	 *            合并状态
	 */
	public void setMerged(boolean merged);

	/**
	 * 合并到单元格
	 * 
	 * @param column
	 *            列
	 * @param row
	 *            行
	 */
	public void mergeIntoCell(int column, int row);

	/**
	 * 获取合并到的单元格信息
	 * 
	 * @return 合并到的单元格信息
	 */
	public CR getMergedToCR();

	/**
	 * @return 克隆对象
	 */
	public Cell clone();
}
